/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestores.iteracao.iteradores;

import gestores.iteracao.manipuladores.IManipulador;
import gestores.janelas.JanelaPrincipal;
import java.io.File;
import java.util.ArrayList;
import java.util.Observable;
import kernel.Kernel;

/**
 * Classe IteradorBase
 *
 * Descrição:
 *
 *
 * @author blaster
 */
public abstract class IteradorBase extends Observable implements IIterador {

    protected ArrayList<File> listadearquivos = new ArrayList<File>(); //lista dos arquivos selecionados para iteração (sem criterios)
    protected ArrayList<File> listadeiteracao = new ArrayList<File>(); //determina os arquivos que serão iterados e a ordem
    protected IManipulador manipulador;
    protected int count = 0;
    protected boolean torun = false;

    public IteradorBase(ArrayList<File> lista) {
        this.listadearquivos = lista;
    }

    public void setManipulador(IManipulador manipulador) {
        this.manipulador = manipulador;
        this.torun = prepararIteracao();
    }

    public Float getDone() {
        if (listadeiteracao == null || manipulador == null) {
            return 0f;
        } else {
            float tempc = count;
            return (float) (tempc / listadeiteracao.size());
        }
    }

    public void stop() {
        torun = false;
    }

    public abstract boolean prepararIteracao();

    @Override
    public void run() {
        setChanged();
        notifyObservers("Processando " + this.listadeiteracao.size() + " arquivos.");
        setChanged();
        notifyObservers("Iniciando a iteração da lista de arquivos...");

        while (torun) {
            setChanged();
            notifyObservers(getDone());
            if (count < listadeiteracao.size()) {
                setChanged();
                notifyObservers("Manipulando arquivo: " + listadeiteracao.get(count));
                if (manipulador.manipularArquivo(listadeiteracao.get(count))) {
                    setChanged();
                    notifyObservers(listadeiteracao.get(count) + " OK");
                } else {
                    notifyObservers(listadeiteracao.get(count) + " Erro");
                }
            } else {
                torun = false;
            }
            count++;
        }
        setChanged();
        notifyObservers("Finalizou Iteração");
        setChanged();
        notifyObservers(Boolean.FALSE);
    }
}
